package br.com.furb.trabalhoFinal.model;

import java.util.Date;
import java.util.GregorianCalendar;

public class Folha {

  private Colaborador colaborador;
  private double totalVencimentos;
  private double totalDescontos;
  private Date dataGeracao;
  private Date referencia;
  private double horasTrabalhadas;

  public double getHorasTrabalhadas() {
    return horasTrabalhadas;
  }

  public Date getDataGeracao() {
    return dataGeracao;
  }

  public Colaborador getColaborador() {
    return colaborador;
  }

  public Date getReferencia() {
    return referencia;
  }

  public double getTotalVencimentos() {
    return totalVencimentos;
  }

  public double getTotalDescontos() {
    return totalDescontos;
  }

  public void setColaborador(Colaborador colaborador) {
    this.colaborador = colaborador;
  }

  public void setTotalVencimentos(double totalVencimentos) {
    this.totalVencimentos = totalVencimentos;
  }

  public void setTotalDescontos(double totalDescontos) {
    this.totalDescontos = totalDescontos;
  }

  public void setDataGeracao(Date dataGeracao) {
    this.dataGeracao = dataGeracao;
  }

  public void setReferencia(Date referencia) {
    this.referencia = referencia;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("XLAH Sistemas Ltda - Copyright 2013               ");
    sb.append("                                                  ");
    sb.append("                                                  ");
    sb.append("Data de geração:      ");
    sb.append(getDataGeracao().toString());
    sb.append("\n");
    sb.append("Módulo Folha de Pagamento                         ");
    sb.append("                                                  ");
    sb.append("                                                  ");

    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(getReferencia());
    sb.append("Referência:                                ");
    sb.append(arrumaTamanhoFacade(cal.MONTH, 2));
    sb.append("\\");
    sb.append(arrumaTamanhoFacade(cal.YEAR, 4));
    sb.append("\n");
    sb.append("\n");
    sb.append("Colaborador: ");
    sb.append(getColaborador().getNome());
    sb.append("\n");
    sb.append("--------------------------------------------------------------------------------------------------------");
    sb.append("--------------------------------------------------------------------------------------------------------");
    sb.append("Codigo Lancamento                                   ");
    sb.append("Descricao Lancamento                                ");
    sb.append("Vencimento                                          ");
    sb.append("Desconto                                            ");
    for (Lancamento lancamento : getColaborador().getLancamentos()) {
      sb.append("\n");
      sb.append(arrumaTamanhoFacade(lancamento.getCodigo()));
      sb.append(arrumaTamanhoFacade(lancamento.getDescricao()));
      if (lancamento.getDebito()) {
        sb.append("                                                  ");
        sb.append(arrumaTamanhoFacade(lancamento.getValor()));
      } else {
        sb.append(arrumaTamanhoFacade(lancamento.getValor()));
        sb.append("                                                  ");
      }
    }
    sb.append("--------------------------------------------------------------------------------------------------------");
    sb.append("--------------------------------------------------------------------------------------------------------");
    sb.append("\n");
    sb.append("Salário Bruto: ");
    sb.append(calcularSalárioBruto());
    sb.append("\n");
    sb.append("Salário Líquido:");
    sb.append(calcularSalarioLiquido());
    return sb.toString();
  }

  private double calcularSalarioLiquido(){
    return calcularSalárioBruto() - getTotalDescontos() + getTotalVencimentos();
  }

  private double calcularSalárioBruto() {
    return (colaborador.getSalario() / colaborador.getCargo().getCargaHoraria()) * getHorasTrabalhadas();
  }

  private String arrumaTamanhoFacade(double value){
    return arrumaTamanhoFacade(String.valueOf(value), 50);
  }

  private String arrumaTamanhoFacade(int value) {
    return arrumaTamanhoFacade(String.valueOf(value), 50);
  }

  private String arrumaTamanhoFacade(String value) {
    return arrumaTamanhoFacade(value, 50);
  }

  private String arrumaTamanhoFacade(int value, int tamanho) {
    return arrumaTamanhoFacade(String.valueOf(value), tamanho);
  }

  private String arrumaTamanhoFacade(String value, int tamanho) {
    StringBuilder sb = new StringBuilder();
    sb.append(value);
    while (sb.length() != tamanho) {
      sb.append(" ");
    }
    return sb.toString();
  }

  public void setHorasTrabalhadas(double horasTrabalhadas) {
    this.horasTrabalhadas = horasTrabalhadas;
  }
}
